package com.shop.interceptor;


import com.shop.constant.CartConstant;
import com.shop.constant.UsersConstant;
import com.shop.pojo.ums.Ums_Member;
import com.shop.vo.UserInfoTo;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.lang.management.ThreadInfo;
import java.util.UUID;

/**
 * 在执行目标方法之前，判断用户的登录状态。并封装传递给controLler目标请求
 */
public class CartInterceptor implements HandlerInterceptor {

    public static ThreadLocal<UserInfoTo> toThreadLocal = new ThreadLocal<>();


    /**
     * 目标方法执行之前
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        //创建一个存储用户信息的
        UserInfoTo userInfoTo = new UserInfoTo();
        //创建session
        HttpSession session = request.getSession();
        //获取用户是否登录信息是的session
        Ums_Member userNameSession =(Ums_Member) session.getAttribute(UsersConstant.LOGIN_USERS);
        //判断用户是否登录
        if(userNameSession != null){
            //如果登录了就把用户的ID值塞进去
                userInfoTo.setUserId(userNameSession.getId());
        }

        //获取cookie
        Cookie[] cookies = request.getCookies();
        //判断有没有cookie
        if(cookies != null && cookies.length > 0) {
            for (Cookie cookie : cookies) {
                //如果有的话就获取他的名字
                String name = cookie.getName();
                //判断名字是否包含我们创建的临时用户
                if (name.equals(CartConstant.TEMP_USER_COOKIE_NAME)){
                    //包含时就把临时用户的值塞进去
                     userInfoTo.setUserKey(cookie.getValue());
                     //有临时就设置为true
                    userInfoTo.setTempUser(true);
                }

            }
         }

        //判断是否登录没有登录一定分配临时用户  需要让浏览器知道 需要业务执行之后
        if(StringUtils.isEmpty(userInfoTo.getUserKey())){
            String uuid = UUID.randomUUID().toString();//创建一个ID 临时用户信息
            userInfoTo.setUserKey(uuid);
        }

        //目标方法执行之前
        toThreadLocal.set(userInfoTo);
        return true;
    }

    /***
     * 业务执行之后进行调用 让浏览器保存cookie
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        UserInfoTo userInfoTo = toThreadLocal.get();
        //有临时用户就用 没有就分配
        //判断没有临时用户信息 如果没有临时用户一定保存一个
        if(!userInfoTo.isTempUser()){
            //不判断就是持续的延长用户的过期时间
            Cookie cookie = new Cookie(CartConstant.TEMP_USER_COOKIE_NAME, userInfoTo.getUserKey());
            //设置cookie的作用域
            cookie.setDomain("localhost");
            //设置过期时间  最大过期时间 以秒为单位
            cookie.setMaxAge(CartConstant.TEMP_USER_COOKIE_TIMEOUT);
            //添加cookie
            response.addCookie(cookie);
        }


    }
}
